package com.crimsec.utils.snmp.model;
/*
 * $Id$
 */
/*
 * объявление enum фактически расширяет java.lang.Enum. 
 * при этом создаются статически доступные экземпляры enum-класса (Enttype)
 * STRING(int), NUMBER(int)... с использованием конструктора Enttype(int) 
 * для чего это нужно ?
 * Чтобы использовать числовые значения в Enum, отличные от ordinal (порядок).
 * Так, в данном случае Enttype.STRING.ordinal==0,Enttype.NUMBER.ordinal==1,
 * что неудобно для хранения в БД, с другой стороны Enttype.STRING.getValue()==100, ...
 * что удобно для хранения в базе (value как ключ, name() как значение)
 * смотри также 
 * http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
 * http://www.quizful.net/post/java_enums   (rus)
 * http://docs.oracle.com/javase/6/docs/api/ъ
 * а также обучающий тест:
 * mvn clean compile test -Dtest=com.crimsec.utils.snmp.model.EnttypeTest 
 */

public enum Enttype {

    //Java requires that the constants be defined first, prior to any fields or methods
    //синхронизировать с init.sql - enttype
    STRING((short) 100),
    NUMBER((short) 200),
    OID((short) 300),
    HOST((short) 400),
    TIME((short) 500),
    /*
     * RFC1155:
     * This application-wide type represents a non-negative integer which
     * counts the time in hundredths of a second since some epoch.  When
     * object types are defined in the MIB which use this ASN.1 type, the
     * description of the object type identifies the reference epoch.
     */
    TIMETICKS((short) 600),//стчетчик времени
    /* 
     *  RFC1155:
     *  This application-wide type represents a 32-bit internet address.  It
     *  is represented as an OCTET STRING of length 4, in network byte-order.
     *  When this ASN.1 type is encoded using the ASN.1 basic encoding rules,
     *  only the primitive encoding form shall be used.
     */
    NETWORKADDRESS((short) 700),
    /* RFC1155:This CHOICE represents an address from one of possibly several  protocol families. 
     * Currently, only one protocol family, the Internet   family, is present in this CHOICE.
     */
    IPADDRESS((short) 800),
    /*
     * фейковый тип обозначающий что переменная mib является узлом для простых переменных-листьев i.e org, dod 
     */
    NODE((short) 900);
    //
    private short value;

    /*The constructor for an enum type must be package-private or private access. 
     * It automatically creates the constants that are defined at the beginning of the enum body. 
     * You cannot invoke an enum constructor yourself. 
     */
    Enttype(Short value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }

    public static Enttype parse(Short id) {
        Enttype type = null; // Default
        //Сюда может прийти и null, примеру если поле Mibent.type_id не установлено (к примеру в тестах)
        if (id != null) {
            for (Enttype item : Enttype.values()) {
                if (item.getValue() == id) {
                    type = item;
                    break;
                }
            }
        }
        return type;
    }
}
